\section{O que é um JDBC driver?}

Um JDBC driver é um componente de software que implementa a API JDBC, permitindo assim às aplicações Java interagirem com uma base de dados. 

A aplicação que utiliza JDBC para aceder a uma base de dados é alheia ao modo como são implementadas as interfaces que utiliza, isso é inteira responsabilidade do driver. A Figura \ref{fig:jdbc-arch} mostra a arquitectura típica do JDBC, e vem reforçar o último ponto: uma aplicação Java utiliza o conjunto de interfaces disponibilizadas pelo JDBC, essas interfaces são implementadas pelo driver que também se encarrega de comunicar com o sistema da base de dados, seja ele qual for (Oracle, SQL Sever, MySQL, etc.).

\begin{figure}[H]
  \centering
  \caption{Arquitectura JDBC}
  \label{fig:jdbc-arch}
  \includegraphics[width=2cm]{images/model/jdbc-arch}
\end{figure}

Cada driver JDBC é construído para um \gls{dbms} (\glssymbol{dbms}) específico implementando o protocolo de comunicação de \glspl{query} e resultados entre o cliente e a base de dados.

Existem quatro categorias de driver\cite{SUNJDBCDRIVERS,WIKIJDBCDRIVERS}:
\begin{description}
  \item[1. JDBC-ODBC] \hfill \\
  Utiliza um driver \gls{odbc} fazendo uma ponte para estabelecer a comunicação. 
  O driver JDBC converte as invocações da API JDBC em invocações a funções ODBC. 
  Uma vez que o ODBC depende de bibliotecas nativas do sistema operativo em que a \glssymbol{jvm} esta a correr, este tipo de driver é dependente da plataforma.
  \item[2. Native-API] \hfill \\
  Converte os pedidos em chamadas a uma biblioteca cliente. 
  O driver JDBC converte as invocações a métodos da API JDBC em invocações nativas da API da base de dados. 
  Este tipo de driver é dependente da plataforma, e necessita que as bibliotecas estejam instaladas no cliente.
  \item[3. Network-Protocol] \hfill \\
  Utiliza uma camada intermédia (middleware) cuja função é converter os pedidos na linguagem (protocolo) da base de dados. 
  A camada intermédia converte as invocações a métodos da API JDBC em mensagem do protocolo da base de dados.
  Este tipo de driver é escrito totalmente em código Java e é independente da plataforma porque a camada intermédia encarrega-se das especificidades do sistema.
  \item[4. Native-Protocol] \hfill \\
  Converte os pedidos directamente no protocolo utilizado pelo \gls{dbms}.
  O seu desempenho é melhor do que o desempenho dos drivers do tipo 1 e 2 porque não existe a conversão em chamadas ODBC ou em chamadas da API da base de dados.
  Este tipo de driver é escrito totalmente em código Java e é independente da plataforma.
  A diferença deste tipo para o tipo 3 é que a conversão no protocolo da base de dados é realizada no cliente, enquanto que no driver do tipo 3 a conversão é realizada na camada intermédia.
\end{description}

Um driver da categoria JDBC-ODBC é conhecido como driver JDBC do Tipo 1.
Um driver da categoria Native-API é conhecido como driver JDBC do Tipo 2.
Um driver da categoria Network-Protocol é conhecido como driver JDBC do Tipo 3.
Um driver da categoria Native-Protocol é conhecido como driver JDBC do Tipo 4.
